package br.unisul.redeNeural;


/**
 * Classe que representa a Rede Neural Artificial(RNA) Regra Hebb.<br>
 * Esta RNA é uma rede de unica camada, ou seja, possui apenas a camada de entra e a de saida.
 * @author Joelson Fernandes
 *
 */
public class RegraHebb extends RedeNeural implements java.io.Serializable{


	/**
	 * 
	 */
	private static final long serialVersionUID = 9083627665842193158L;

	/**
	 * Constroi uma RNA Regra Heeb, esta rede ignora as camadas intermediarias que possa possuir 
	 * na configuração.<br>
	 * Apesar desta RNA ser simples e poder ser feita em uma época, permitimos o uso de {@link TesteParada} no treino da RNA
	 * @param configuracao - configuração da RNA
	 */
	public RegraHebb(Configuracao configuracao) {
		super(configuracao);
	}

	public void treinar(ParTreino parTreino){
		getConfiguracao().setMultiCamadas(false);
		inicializarValores();
		while(!super.verificarParada()){
			for (int i = 0; i < parTreino.getQuantidade(); i++) {
				try {
					atualizarEntradas(parTreino.getEntrada(i));
					for (int j = 0; j < getConfiguracao().getQuantidadeSaida(); j++) {
						Neuronio[] neuronios = getNeuroniosEntrada(1, j);
						Peso[] pesos = getPesosEntrada(1, j);
						for (int k = 0; k < neuronios.length; k++) {
							double d = neuronios[k].getValorNeuronio() * parTreino.getSaida(i)[j];
							atualizarPeso(pesos[k], d);
						}
						atualizarVies(getNeuronio(1, j).getVies(), parTreino.getSaida(i)[j]);
					}
				} catch (RedeNeuralException e) {
					e.printStackTrace();
				}
			}
		}

	}

}
